import pkg from './package.json';
import dayjs from 'dayjs';
import { loadEnv } from 'vite';
import { resolve } from 'path';
import { generateModifyVars } from './build/generate/generateModifyVars';
import { createProxy } from './build/vite/proxy';
import { wrapperEnv } from './build/utils';
import { createVitePlugins } from './build/vite/plugin';
import { OUTPUT_DIR } from './build/constant';
function pathResolve(dir) {
    return resolve(process.cwd(), '.', dir);
}
const { dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
    pkg: { dependencies, devDependencies, name, version },
    lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
};
export default ({ command, mode }) => {
    const root = process.cwd();
    const env = loadEnv(mode, root);
    // The boolean type read by loadEnv is a string. This function can be converted to boolean type
    const viteEnv = wrapperEnv(env);
    const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv;
    const isBuild = command === 'build';
    return {
        base: VITE_PUBLIC_PATH,
        root,
        resolve: {
            alias: [
                {
                    find: 'vue-i18n',
                    replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
                },
                // /@/xxxx => src/xxxx
                {
                    find: /\/@\//,
                    replacement: pathResolve('src') + '/',
                },
                // /#/xxxx => types/xxxx
                {
                    find: /\/#\//,
                    replacement: pathResolve('types') + '/',
                },
            ],
        },
        server: {
            // Listening on all local IPs
            host: true,
            https: false,
            port: VITE_PORT,
            // Load proxy configuration from .env
            proxy: createProxy(VITE_PROXY),
        },
        build: {
            minify: 'esbuild',
            target: 'es2015',
            cssTarget: 'chrome80',
            outDir: OUTPUT_DIR,
            terserOptions: {
                compress: {
                    keep_infinity: true,
                    // Used to delete console in production environment
                    drop_console: VITE_DROP_CONSOLE,
                    drop_debugger: true,
                },
            },
            // Turning off brotliSize display can slightly reduce packaging time
            reportCompressedSize: false,
            chunkSizeWarningLimit: 2000,
        },
        define: {
            // setting vue-i18-next
            // Suppress warning
            __INTLIFY_PROD_DEVTOOLS__: false,
            __APP_INFO__: JSON.stringify(__APP_INFO__),
        },
        css: {
            preprocessorOptions: {
                less: {
                    modifyVars: generateModifyVars(),
                    javascriptEnabled: true,
                },
            },
        },
        // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed
        plugins: createVitePlugins(viteEnv, isBuild),
        optimizeDeps: {
            esbuildOptions: {
                target: 'es2020',
            },
            // @iconify/iconify: The dependency is dynamically and virtually loaded by @purge-icons/generated, so it needs to be specified explicitly
            include: [
                '@vue/runtime-core',
                '@vue/shared',
                '@iconify/iconify',
                'ant-design-vue/es/locale/zh_CN',
                'ant-design-vue/es/locale/en_US',
                'vue',
                'map-factory',
                'element-plus/es',
                'element-plus/es/components/form/style/index',
                'element-plus/es/components/radio-group/style/index',
                'element-plus/es/components/radio/style/index',
                'element-plus/es/components/checkbox/style/index',
                'element-plus/es/components/checkbox-group/style/index',
                'element-plus/es/components/switch/style/index',
                'element-plus/es/components/time-picker/style/index',
                'element-plus/es/components/date-picker/style/index',
                'element-plus/es/components/col/style/index',
                'element-plus/es/components/form-item/style/index',
                'element-plus/es/components/alert/style/index',
                'element-plus/es/components/breadcrumb/style/index',
                'element-plus/es/components/select/style/index',
                'element-plus/es/components/input/style/index',
                'element-plus/es/components/breadcrumb-item/style/index',
                'element-plus/es/components/tag/style/index',
                'element-plus/es/components/pagination/style/index',
                'element-plus/es/components/table/style/index',
                'element-plus/es/components/table-column/style/index',
                'element-plus/es/components/card/style/index',
                'element-plus/es/components/row/style/index',
                'element-plus/es/components/button/style/index',
                'element-plus/es/components/menu/style/index',
                'element-plus/es/components/sub-menu/style/index',
                'element-plus/es/components/menu-item/style/index',
                'element-plus/es/components/option/style/index',
                '@element-plus/icons-vue',
                'pinia',
                'axios',
                'vue-request',
                'vue-router',
                '@vueuse/core',
            ],
        },
    };
};
